package edu.cibertec.sicsolutions.vfs.spring;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import edu.cibertec.sicsolutions.parameters.Parameter;
import edu.cibertec.sicsolutions.util.ClassUtil;
import edu.cibertec.sicsolutions.util.StringUtil;

public final class SpringContext {
	
	private static ApplicationContext instance;
	
	private final static String  SPRING_CONFIG = "springConfig";
	
	private SpringContext(){
		
	}
	
	/**
	 * Obtiene la instancia unica del ApplicationContext
	 * <pre>
	 * public void ejbCreate(){
	 * 	SpringContext.getContext();
	 * }
	 * </pre>
	 * @return
	 */
	public static ApplicationContext getContext(){				
		if (instance == null) {
			getContextSync();
		}
		return instance;
	}
	
	private static synchronized ApplicationContext getContextSync(){
		if (instance == null) {
			System.out.println("JPRU: Frw val traidos de parameterConfig:" + Parameter.getInstance().getValue(SPRING_CONFIG));
			final String[] springConfig = StringUtil.split(Parameter.getInstance().getValue(SPRING_CONFIG));
			
			instance = new ClassPathXmlApplicationContext(springConfig);
			/*instance = new FileSystemXmlApplicationContext(springConfig);*/
			System.out.println("JPRU: Frw se obtuvo instance of XX");
		}
		return instance;
	}
	
	/** 
	 * Obtiene el  definido en los archivos XML de configuracion del Spring
	 * <pre>
	 * MyDao myDao = (MyDao)SpringContext.get("Identificador_de_MyDaoImpl");
	 * </pre>
	 * @param beanName
	 * @return
	 */
	public static Object get(String beanName){
		return getContext().getBean(beanName);
	}
	
	/**
	 * Obtiene el  definido en los archivos XML de configuracion del Spring
	 * Recordar que por estandar los  definidos tienen el nombre de la interface
	 * @param clazz
	 * @return
	 */
	public static Object get(Class clazz){
		String pack = ClassUtil.getPackageName(clazz);
		String[] array = StringUtil.split(pack, '.');		
		return get(array[array.length-1] + "." + ClassUtil.getShortClassName(clazz));
	}

}
